home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 426-450 / disk_438 / toollib / source / io.s < prev    next >
Text File  |  1992-05-06  |  8KB  |  273 lines

  1.             opt     l+,o+,ow-
  2. *
  3. *   io.s version 7.6 - © Copyright 1990 Jaba Development
  4. *
  5. *   Author    : Jan van den Baard
  6. *   Assembler : Devpac version 2.14
  7. *
  8.     incdir  'sys:devpac_inc/
  9.     include 'exec/exec_lib.i'
  10.     include 'tool.i'
  11.     include 'mymacros.i'
  12.  
  13.     xdef    CreatePort
  14.     xdef    DeletePort
  15.     xdef    CreateExtIO
  16.     xdef    DeleteExtIO
  17.     xdef    CreateStdIO
  18.     xdef    DeleteStdIO
  19.  
  20.     xdef    CreateTimeDelay
  21.     xdef    DoTimeDelay
  22.     xdef    DeleteTimeDelay
  23.  
  24. *
  25. * port = CreatePort(name,prior)
  26. *  D0                A0   D0
  27. *
  28. CreatePort:     movem.l d2-d3/a2-a3/a6,-(sp)
  29.                 move.l  a0,a3
  30.                 move.l  d0,d3
  31.                 move.l  (_SysBase).w,a6
  32.                 moveq   #-1,d0
  33.                 libcall AllocSignal
  34.                 move.l  d0,d2
  35.                 cmp.l   #-1,d0
  36.                 bne.s   SigOK
  37. NoPort:         cldat   d0
  38. EndCP:          movem.l (sp)+,d2-d3/a2-a3/a6
  39.                 rts
  40. SigOK:          moveq   #MP_SIZE,d0
  41.                 move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  42.                 libcall AllocMem
  43.                 move.l  d0,a2
  44.                 bne.s   MpOK
  45.                 move.l  d2,d0
  46.                 libcall FreeSignal
  47.                 bra.s   NoPort
  48. MpOK:           move.l  a3,LN_NAME(a2)
  49.                 move.b  d3,LN_PRI(a2)
  50.                 move.b  #NT_MSGPORT,LN_TYPE(a2)
  51.                 clr.b   MP_FLAGS(a2)
  52.                 move.b  d2,MP_SIGBIT(a2)
  53.                 cladr   a1
  54.                 libcall FindTask
  55.                 move.l  d0,MP_SIGTASK(a2)
  56.                 cmpa.l  #0,a3
  57.                 beq.s   NoName
  58.                 move.l  a2,a1
  59.                 libcall AddPort
  60.                 bra.s   Added
  61. NoName:         lea.l   MP_MSGLIST(a2),a0
  62.                 move.l  a0,LH_HEAD(a0)
  63.                 addq.l  #4,LH_HEAD(a0)
  64.                 clr.l   LH_TAIL(a0)
  65.                 move.l  a0,LH_TAILPRED(a0)
  66. Added:          move.l  a2,d0
  67.                 bra.s   EndCP
  68.  
  69. *
  70. * DeletePort(port)
  71. *             A0
  72. *
  73. DeletePort:     movem.l a2/a6,-(sp)
  74.                 move.l  a0,a2
  75.                 move.l  (_SysBase).w,a6
  76.                 tst.l   LN_NAME(a2)
  77.                 beq.s   NoRem
  78.                 move.l  a2,a1
  79.                 libcall RemPort
  80. NoRem:          move.b  #-1,LN_TYPE(a2)
  81.                 lea.l   MP_MSGLIST(a2),a0
  82.                 move.l  #-1,LH_HEAD(a0)
  83.                 cldat   d0
  84.                 move.b  MP_SIGBIT(a2),d0
  85.                 libcall FreeSignal
  86.                 moveq   #MP_SIZE,d0
  87.                 move.l  a2,a1
  88.                 libcall FreeMem
  89.                 movem.l (sp)+,a2/a6
  90.                 rts
  91.  
  92. *
  93. * IOReq = CreateExtIO(port,size)
  94. *  D0                  A0   D0
  95. *
  96. CreateExtIO:    movem.l d2/a2-a3/a6,-(sp)
  97.                 move.l  a0,a3
  98.                 move.l  d0,d2
  99.                 cmpa.l  #0,a3
  100.                 bne.s   PortGiven
  101. NoIO:           cldat   d0
  102. EndCEI:         movem.l (sp)+,d2/a2-a3/a6
  103.                 rts
  104. PortGiven:      move.l  d2,d0
  105.                 move.l  #MEMF_PUBLIC+MEMF_CLEAR,d1
  106.                 move.l  (_SysBase).w,a6
  107.                 libcall AllocMem
  108.                 move.l  d0,a2
  109.                 beq.s   NoIO
  110. ReqOK:          move.b  #NT_MESSAGE,LN_TYPE(a2)
  111.                 move.w  d2,MN_LENGTH(a2)
  112.                 move.l  a3,MN_REPLYPORT(a2)
  113.                 move.l  a2,d0
  114.                 bra.s   EndCEI
  115.  
  116. *
  117. * StdIO = CreateStdIO(port)
  118. *   D0                 A0
  119. *
  120. CreateStdIO:    moveq   #IOSTD_SIZE,d0
  121.                 bsr.s   CreateExtIO
  122.                 rts
  123.  
  124. *
  125. * DeleteStdIO(ioreq), DeleteExtIO(ioreq)
  126. *               A0                 A0
  127. *
  128. DeleteStdIO:
  129. DeleteExtIO:    movem.l a2/a6,-(sp)
  130.                 move.l  a0,a2
  131.                 cmpa.l  #0,a2
  132.                 bne.s   IOPGiven
  133. EndDI:          movem.l (sp)+,a2/a6
  134.                 rts
  135. IOPGiven:       move.b  #-1,LN_TYPE(a2)
  136.                 move.l  #-1,IO_DEVICE(a2)
  137.                 move.l  #-1,IO_UNIT(a2)
  138.                 cldat   d0
  139.                 move.w  MN_LENGTH(a2),d0
  140.                 move.l  a2,a1
  141.                 move.l  (_SysBase).w,a6
  142.                 libcall FreeMem
  143.                 bra.s   EndDI
  144.  
  145. *
  146. * timedel = CreateTimeDelay(UserPort,Secs,Micros)
  147. *   D0                        A0      A0    D1
  148. *
  149. CreateTimeDelay:
  150.                 movem.l d2-d3/a2-a3/a6,-(sp)
  151.                 move.l  a0,a3
  152.                 move.l  d0,d2
  153.                 move.l  d1,d3
  154.                 move.l  (_SysBase).w,a6
  155.                 moveq   #td_SIZEOF,d0
  156.                 move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
  157.                 libcall AllocMem
  158.                 move.l  d0,a2
  159.                 beq.s   NoTimeDel
  160.                 move.l  a3,td_UserPort(a2)
  161.                 cladr   a0
  162.                 cldat   d0
  163.                 bsr     CreatePort
  164.                 move.l  d0,td_ReplyPort(a2)
  165.                 beq.s   NoPortMem
  166.                 move.l  d0,a0
  167.                 moveq   #IOTV_SIZE,d0
  168.                 bsr     CreateExtIO
  169.                 move.l  d0,td_TimeRequest(a2)
  170.                 beq.s   NoReqMem
  171.                 move.l  d0,a1
  172.                 lea.l   timer_name,a0
  173.                 moveq   #UNIT_VBLANK,d0
  174.                 cldat   d1
  175.                 libcall OpenDevice
  176.                 tst.l   d0
  177.                 bne.s   NoTimer
  178.                 move.l  td_TimeRequest(a2),a0
  179.                 move.w  #TR_ADDREQUEST,IO_COMMAND(a0)
  180.                 lea.l   IOTV_TIME(a0),a0
  181.                 move.l  d2,TV_SECS(a0)
  182.                 move.l  d3,TV_MICRO(a0)
  183.                 move.l  a2,d0
  184. EndCTD:         movem.l (sp)+,d2-d3/a2-a3/a6
  185.                 rts
  186. NoTimer:        move.l  td_TimeRequest(a2),a0
  187.                 bsr     DeleteExtIO
  188. NoReqMem:       move.l  td_ReplyPort(a2),a0
  189.                 bsr     DeletePort
  190. NoPortMem:      move.l  a2,a1
  191.                 moveq   #td_SIZEOF,d0
  192.                 libcall FreeMem
  193. NoTimeDel:      cldat   d0
  194.                 bra.s   EndCTD
  195.  
  196. *
  197. * DoTimeDelay(TimeDelay)
  198. *                A0
  199. *
  200. DoTimeDelay:    movem.l d2-d4/a2/a6,-(sp)
  201.                 move.l  a0,a2
  202.                 move.l  (_SysBase).w,a6
  203.                 move.l  td_TimeRequest(a2),a1
  204.                 lea.l   IOTV_TIME(a1),a0
  205.                 move.l  TV_SECS(a0),d2
  206.                 move.l  TV_MICRO(a0),d3
  207.                 libcall SendIO
  208.                 tst.l   td_UserPort(a2)
  209.                 beq.s   NoUserPort
  210.                 move.l  td_UserPort(a2),a0
  211.                 cldat   d0
  212.                 move.b  MP_SIGBIT(a0),d0
  213.                 bsr.s   SBit
  214.                 move.l  d0,d1
  215.                 bra.s   WaitForMsg
  216. NoUserPort:     cldat   d1
  217. WaitForMsg:     cldat   d0
  218.                 move.l  td_ReplyPort(a2),a0
  219.                 move.b  MP_SIGBIT(a0),d0
  220.                 bsr.s   SBit
  221.                 add.l   d1,d0
  222.                 libcall Wait
  223.                 move.l  td_TimeRequest(a2),a1
  224.                 libcall CheckIO
  225.                 tst.l   d0
  226.                 beq.s   NoAbort
  227.                 move.l  td_TimeRequest(a2),a1
  228.                 libcall AbortIO
  229.                 move.l  td_ReplyPort(a2),a0
  230.                 libcall WaitPort
  231.                 cldat   d4
  232.                 bra.s   RemReq
  233. NoAbort:        moveq   #1,d4
  234. RemReq:         move.l  td_TimeRequest(a2),a0
  235.                 libcall Remove
  236.                 move.l  td_TimeRequest(a2),a0
  237.                 move.w  #TR_ADDREQUEST,IO_COMMAND(a0)
  238.                 lea.l   IOTV_TIME(a0),a0
  239.                 move.l  d2,TV_SECS(a0)
  240.                 move.l  d3,TV_MICRO(a0)
  241.                 move.l  d4,d0
  242.                 movem.l (sp)+,d2-d4/a2/a6
  243.                 rts
  244. SBit:           movem.l d1,-(sp)
  245.                 moveq   #1,d1
  246.                 lsl.l   d0,d1
  247.                 move.l  d1,d0
  248.                 move.l  (sp)+,d1
  249.                 rts
  250.  
  251. *
  252. * DeleteTimeDelay(TimeDelay)
  253. *                    A0
  254. *
  255. DeleteTimeDelay:
  256.                 movem.l a2/a6,-(sp)
  257.                 move.l  a0,a2
  258.                 move.l  (_SysBase).w,a6
  259.                 move.l  td_TimeRequest(a2),a1
  260.                 libcall CloseDevice
  261.                 move.l  td_TimeRequest(a2),a0
  262.                 bsr     DeleteExtIO
  263.                 move.l  td_ReplyPort(a2),a0
  264.                 bsr     DeletePort
  265.                 moveq   #td_SIZEOF,d0
  266.                 move.l  a2,a1
  267.                 libcall FreeMem
  268.                 movem.l (sp)+,a2/a6
  269.                 rts
  270.  
  271. timer_name:     TIMERNAME
  272.  
  273.